package com.linyaonan.leetcode.medium._2090;

import java.util.Arrays;

/**
 * 给你一个下标从 0 开始的数组 nums ，数组中有 n 个整数，另给你一个整数 k 。
 *
 * 半径为 k 的子数组平均值 是指：nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值，即下标在 i - k 和 i + k 范围（含 i - k 和 i + k）内所有元素的平均值。如果在下标 i 前或后不足 k 个元素，那么 半径为 k 的子数组平均值 是 -1 。
 *
 * 构建并返回一个长度为 n 的数组 avgs ，其中 avgs[i] 是以下标 i 为中心的子数组的 半径为 k 的子数组平均值 。
 *
 * x 个元素的 平均值 是 x 个元素相加之和除以 x ，此时使用截断式 整数除法 ，即需要去掉结果的小数部分。
 *
 * 例如，四个元素 2、3、1 和 5 的平均值是 (2 + 3 + 1 + 5) / 4 = 11 / 4 = 2.75，截断后得到 2 。
 *
 * 输入：nums = [7,4,3,9,1,8,5,2,6], k = 3
 * 输出：[-1,-1,-1,5,4,4,-1,-1,-1]
 * 解释：
 * - avg[0]、avg[1] 和 avg[2] 是 -1 ，因为在这几个下标前的元素数量都不足 k 个。
 * - 中心为下标 3 且半径为 3 的子数组的元素总和是：7 + 4 + 3 + 9 + 1 + 8 + 5 = 37 。
 *   使用截断式 整数除法，avg[3] = 37 / 7 = 5 。
 * - 中心为下标 4 的子数组，avg[4] = (4 + 3 + 9 + 1 + 8 + 5 + 2) / 7 = 4 。
 * - 中心为下标 5 的子数组，avg[5] = (3 + 9 + 1 + 8 + 5 + 2 + 6) / 7 = 4 。
 *
 *
 * n == nums.length
 * 1 <= n <= 10^5
 * 0 <= nums[i], k <= 10^5
 *
 *
 * @author: Lin
 * @date: 2024/10/25
 */
public class KRadiusSubarrayAverages {

    public int[] getAverages(int[] nums, int k) {
        // 1. 半径为0直接返回
        if (k == 0) {
            return nums;
        }
        // 2. 当k大于等于 nums.length < 2k + 1 返回全部 -1
        if (nums.length < 2 * k + 1) {
            Arrays.fill(nums, - 1);
            return nums;
        }
        int tt = 2 * k + 1;
        int[] r = new int[nums.length];
        Arrays.fill(r, - 1);
        // 3. k大于0时，从索引0到k-1 全部为-1，以及从 max - k + 1 到 max 全部为 -1，剩余的数值从index = k统计到 max - k
        long add = 0L;
        int count = 0;
        int index = k;
        for (int i = 0; i < nums.length; i++) {
            add = add + nums[i];
            count++;
            if (count < tt) {
                continue;
            }
            r[index++] = (int) (add / tt);
            add -= nums[i - tt + 1];
            count--;
        }

        return r;
    }

}
